#include <bits/stdc++.h>
#define int long long 
using namespace std;


const int maxn = 1e5+5;
int cnt;
int head[maxn];

// 邻接表
struct Edge{
	int next;
	int to;
}edge[maxn << 1];

// 添加边
void add(int from, int to) {
	edge[++cnt].next = head[from];
	edge[cnt].to = to;
	head[from] = cnt;
}

// 使用 dfs 处理每个节点的父节点, 及其深度
int dep[maxn];
int fa[maxn][30]; // fa[i][j] 表示 i 节点的第 2^j 父亲节点

void dfs(int x, int f){
	dep[x] = dep[f]+1;
	fa[x][0] = x;
	
	// 当 i 为 0 时表示没有邻接节点了
	for (int i=head[x];i;i=edge[i].next) {
		int t = edge[i].to;
		if (t == f) {
			// 表示遍历过了
			continue;
		}
		// 继续 dfs
		dfs(t, x);
	}
}



// 使用 倍增, dp 处理 lca

int lca(int x, int y){
	// 假设 x 永远是最深的那个
	if (dep[x] < dep[y]) {
		swap(x, y);
	}
	
	for (int i=20;i>=0;i--) {
		if (dep[fa[x][i]] >= dep[y]) {
			x = fa[x][i]; // 每次从大的开始跳
		}
	}
	// 最终重叠了
	if (x==y) {
		return x;
	}
	
	// 同样先每次跳很大步
	for (int i=20;i>=0;i--) {
		if (fa[x][i] != fa[y][i]) {
			// 这次需要他们的祖先不同时再跳, 因为最上面的都是他们的祖先, 如果跳的很大, 那么找到的是靠上面的, 而不是最近的
			x = fa[x][i];
			y = fa[y][i];
		}
	}
	
	// 最后, x 和 y 一定是都只 差 1 步同时跳到最近公共祖先
	// 使用二进制就可以知道
	return fa[x][0];
}

void solve(){
	int n;
	cin >> n;
	for (int i=1; i<=n;i++) {
		int a, b;
		cin >> a >> b;
		add(a, b), add(b, a);  // 这里注意要加两次
	}
	// DFS 处理深度以及父亲节点
	dfs(1, 0);
	
	// 使用倍增进行预处理
	for (int j=1;j<=20;j++) {
		for (int i=1;i <= n;i++) { // i <= ?
			fa[i][j] = fa[fa[i][j-1]][j-1]; // 
		}
	}
	
	int q;
	cin >> q;
	for (int i=1;i<=q;i++) {
		int a, b;
		cin >> a >> b;
		cout << lca(a, b) << '\n';
	}
	
	
}



signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
//	cin >> t;
	t = 1;
	while(t--){
		//TODO
		solve();
	}
	return 0;
}
